994
6909
Então estou desenvolvendo um jogo social, onde você tem uma certa quantidade de tempo para fazer uma tarefa. Por ser social, você pode bater um papo com o outro jogador.
Cada vez que você receber uma mensagem de chat, você também receberá uma notificação e ao clicar nela será redirecionado para a tela de chat com ele. No momento, isso está funcionando bem.
O que eu não quero é que o usuário receba uma notificação de chat enquanto ele realmente está jogando no PlayActivity.
Também seria bom, se a notificação já mostrada pudesse ser ignorada ou suspensa para um momento posterior enquanto ele estiver no PlayActivity.
Isso é realizável?
Uma abordagem diferente poderia ser cancelar todas as notificações já mostradas e colocar o BroadcastReceiver em hibernação e reativar todas as notificações e o BroadcastReceiver após a conclusão da PlayActivity.
Também não é possível?
O aplicativo poderia pelo menos perguntar antes de sair da atividade? assim eu poderia avisá-lo e se ele ainda for embora, o jogo poderia ser valorizado contra ele.
O que eu faço agora é apenas uma solução alternativa, eu coloco o PlayActivity em tela inteira e verifico se o foco mudou, por exemplo, se ele estiver arrastando para baixo a barra de status / área de notificação. Mas isso é apenas um hack, algo que eu realmente gostaria de acabar com ele.
Como você vê, não tenho certeza de qual poderia ser a abordagem certa aqui. O que um desenvolvedor de software Android profissional faria no meu caso?
Desde já, obrigado!
No momento, estou lidando com notificações estendendo um BroadcastReceiver. O código é anexado no final, se você precisar de outras partes do meu código, me avise!
public class PushBroadcastReceiver estende BroadcastReceiver
{
@Sobrepor
public void onReceive (contexto de contexto, intenção de intenção)
{
tentar
{
JSONObject json =
novo JSONObject (
intent.getExtras ()
.getString ("KEY"));
notificar (contexto, intenção, json);
}
catch (JSONException e)
{
L.debug (App.TAG, "JSONException:" + e.getMessage ());
}
}
notificação de void privado (Context ctx, Intent i, JSONObject dataObject) lança JSONException
{
NotificationManager nm = (NotificationManager)
ctx.getSystemService (Context.NOTIFICATION_SERVICE);
boolean createNotification = false;
PendingIntent pi = null;
int gameId = 0;
// bate-papo
if (dataObject.getString ("KEY_CHAT"). equals ("VALUE_CHAT")) {
Intent intent = novo Intent (ctx, ChatActivity.class);
intent.putExtra ("operatorUsername", dataObject.getString (PARSE_JSON_OPPONENT_USERNAME_KEY));
intent.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY));
pi = PendingIntent.getActivity (ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY));
createNotification = true;
// jogos
} else if (dataObject.getString ("KEY_GAME"). equals ("VALUE_GAME")) {
Intent intent = novo Intent (ctx, SS6RunningGameActivity.class);
intent.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY));
gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY));
pi = PendingIntent.getActivity (ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
createNotification = true;
}
if (createNotification) {
Uri sound = Uri.parse ("android.resource: //"
+ ctx.getPackageName () + "/" + R.raw.push_notif);
ícone int = R.drawable.icon_notification_android;
String tickerText =
dataObject.getString ("TEXT");
Notificação mNotification = new NotificationCompat.Builder (ctx)
.setContentTitle (ctx.getResources (). getString (R.string.app_name))
.setContentText (tickerText)
.setSmallIcon (ícone)
.setContentIntent (pi)
.setSound (som)
.setDefaults (Notification.DEFAULT_VIBRATE)
.setAutoCancel (true)
.setStyle (new NotificationCompat.BigTextStyle ()
.bigText (tickerText))
.Construir();
nm.notify (gameId, mNotification);
}
} 
Pode haver muitas abordagens para isso.
Um dos mais simples seria o seguinte:
Use SharedPreferences. Adicione um valor booleano para indicar que PlayActivity está em execução no momento.
Em onCreate (Bundle) de PlayActivity, faça o seguinte:
// Inicialização
Preferências de SharedPreferences = getSharedPreferences ("MY_PREF_FILE_NAME", 0);
Edição do editor = preferências.edit ();
// Aqui, "PLAY_ACTIVITY_IS_RUNNING" é a `chave` e` verdadeiro` é o valor
// Estamos dizendo que `PlayActivity` está em execução
edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", verdadeiro);
edit.commit ();
Agora, em onPause () de PlayActivity, defina este booleano como false - indicando que estamos prestes a sair de PlayActivity:
// Inicialização
Preferências de SharedPreferences = getSharedPreferences ("MY_PREF_FILE_NAME", 0);
Edição do editor = preferências.edit ();
// Aqui, "PLAY_ACTIVITY_IS_RUNNING" é a `chave` e` false` é o valor
// Estamos dizendo que `PlayActivity` não está mais em execução
edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", falso);
edit.commit ();
O descanso é bastante simples.
Em PushBroadcastReceiver, abra SharedPreferences e verifique o valor atribuído à chave PLAY_ACTIVITY_IS_RUNNING. Se este valor for falso, continue postando as notificações. Caso contrário, recolha-os para mais tarde.
public class PushBroadcastReceiver extends BroadcastReceiver {
@Sobrepor
public void onReceive (Context context, Intent intent) {
Preferências de SharedPreferences = context.getSharedPreferences (
"MY_PREF_FILE_NAME", 0);
// Recupere o valor armazenado para a chave "PLAY_ACTIVITY_IS_RUNNING"
// O segundo argumento `false` é o valor padrão
// caso a chave não exista - isso é lógico
boolean playActivityIsRunning = preferences.getBoolean (
"PLAY_ACTIVITY_IS_RUNNING", falso)
// PlayActivity está em execução
if (playActivityIsRunning) {
// armazene objetos JSON em algum lugar e lide com eles mais tarde
} outro {
tentar {
JSONObject json = novo JSONObject (intent.getExtras (). GetString ("KEY"));
notificar (contexto, intenção, json);
} catch (JSONException e) {
L.debug (App.TAG, "JSONException:" + e.getMessage ());
}
}
}
notificar void privado (Context ctx, Intent i, JSONObject dataObject) throws JSONException {
....
....
}
}
Você precisará encontrar uma maneira de postar as notificações pendentes. Uma solução para isso é enviar uma transmissão separada para outro BroadcastReceiver em onPause () de PlayActivity. Mas isso pode ser problemático porque onPause () é chamado mesmo quando o usuário está mudando a orientação. Talvez este BroadcastReceiver possa começar a funcionar após um atraso de 1 segundo? Isso seria tempo suficiente para a atividade ser recriada - e o valor de PLAY_ACTIVITY_IS_RUNNING redefinido (já que onCreate (Bundle) de PlayActivity será chamado novamente).
Então, o fluxo seria:
onPause é chamado
defina o valor como falso em SharedPreferences
enviar a transmissão para lidar com notificações pendentes
coloque o código de BroadcastReceiver dentro de um Runnable. Poste este Runnable com um atraso de 1 segundo usando um Handler.
dentro do BroadcastReciever => verifique o valor de PLAY_ACTIVITY_IS_RUNNING em SharedPreferences <= isso será feito após 1 segundo. Se o usuário apenas alterasse a orientação da tela, o valor de PLAY_ACTIVITY_IS_RUNNING seria verdadeiro. Caso contrário, se o usuário navegasse para fora de PlayActivity, o valor seria falso.
7
|
sua resposta
StackExchange.ifUsing ("editor", function () {
StackExchange.using ("externalEditor", function () {
StackExchange.using ("snippets", function () {
StackExchange.snippets.init ();
});
});
}, "partes de codigo");
StackExchange.ready (function () {
var channelOptions = {
tags: "" .split (""),
id: "1"
};
initTagRenderer ("". split (""), "" .split (""), channelOptions);
StackExchange.using ("externalEditor", function () {
// Tem que disparar o editor após os snippets, se os snippets estiverem habilitados
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ("snippets", function () {
createEditor ();
});
}
outro {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor: false,
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputaçãoToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46,2665 7,94324 47,1084 7,58816C47.4091 7,46349 47,7169 7,36433 48,0099 7,26993C48.9099 6,97997 49,672 6,73443 49,672 5,93063C49,672 5,22043 48,9832 4,61182 48,1414 4,61182C47,4335 4,26993C48.9099 6,97997 49,672 6,73443 49,672 5,93063C49,672 5,22043 48,9832 4,61182 48,1414 4,61182C47,4335 4,6431182 4,25.654,23,7623,74,6281 4,9281 467823,621 4,96281 4,9823,623,623,461,45,023,74,6281 4,9823,1623,623,14,6281 4,9282 C 4,9281 4,923,623,623,76,2 53,76,23,76,823,14,65,0281 4,928,023,623,14,65,0281 4,928,023,623. 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419 C32.448.492 12954.116 34.954.634.634.37,0451 14.0484C39.9723 14,0484 41,5985 12,6954 41,5985 10.1419V6.59049C41.5985 5,28821 41,1394 4,66232 40,1061 4.66232C39.0732 4,66232 38,5948 5,28821 38,5948 6.59049V9.60062C38.5948 10,8521 38,2696 11,5455 37,0451 11.5455C35.8209 11,5455 35,4954 10,8521 35,4954 9.60062V6.59049C35. 4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd33 \ "d = \" M25.66 C27.8049 17,6335 29,3739 16,9402 30,2537 15.6379C30.8468 14,7755 30,9615 13,5579 30,9615 11.9512V6.59049C30.9615 5,28821 30,4833 4,66231 29,4502 4.66231C28.9913 4,66231 28,4555 4,94978 28,1109 5.50789C27.499 4,86533 26,7335 4,56087 25,7005 4.56087C23.1369 4,56087 21,0134 6,57349 21,0134 9,27932 C21.0134 11.9852 23.003 13,913 25.3754 13.913C26.5612 13,913 27.4607 13,4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1302 28.1301 12.983C28.1 27.131. 349 15.2321 24,1352 14,9821 23,5661 14.7787C23.176 14,6393 22,8472 14,5218 22,5437 14.5218C21.7977 14,5218 21,2429 15,0123 21,2429 15.6887C21.2429 16,7375 22,9072 17,6335 25,6622 17.6335ZM24.1317 9.27932C24.1317 7,94324 24,9928 7,09766 26,1024 7.09766C27.2119 7,09766 28,0918 7,94324 28,0918 9,27932 C28.0918 27,2311 11,5116 26,1024 10,6321 11.5116C24.9737 11,5116 24,1317 10,6491 24,1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11.9512C16.8045 17,2637 13,8962 18,2965 13,2535 13.8962C19.3298 13,8962 19,8079 13,2535 19,8079 11.9512V8. 12928C19.8079 5,82936 18,4879 4,62866 16,4027 4.62866C15.1594 4,62866 14,279 4,98375 13,3609 5.88013C12.653 5,05154 11,6581 4,62866 10,3573 4.62866C9.34336 4,62866 8,57809 4,89931 7,9466 5.5079C7.58314 4,9328 7,10506 4,66232 6,51203 4.66232C5.47873 4,66232 5,00066 5,28821 5,00066 6.59049V11. 9512C5.00066 13,2535 5,47873 13,8962 6,51203 13,8962C7,54479 13,8962 8,0232 13,2535 8,0232 11,9512V8,90741C8,0232 7,58817 8,44431 6,91179 9,53458 6,91179C10,5104 6,91179 10. 893 7,58817 10,893 8,94108V11.9512C10.893 13,2535 11,3711 13,8962 12,4044 13,8962C13,4375 13,8962 13,92,39157 13,2535 13,9157 11,9512V8,90741C13,9157,888817 14,3365 6,91179 15,4263 12,4044 13,8962C13,4375 13,8962 13,92,39157 13,2535 13,9157 11,9512V8,90741C13,9157,788817 14,3365 6,91179 15,4263 12,4044 13,8962C13,4375 13,8962 13,92,39157 13,2535 13,9157 11,9512V8,90741C13,9157,88,8817 14,3365 6,91179 15,4269 6,911,79 C16,80 9,5118 c. d = \ "M3.31675 6.59049C3.31675 2,83866 4,66232 1,82471 5,28821 4.66232C0.791758 4,66232 0,313354 5,28821 0,313354 0,791758 13,8962 13,2535 6.59049V11.9512C0.313354 1,82471 13.8962C2.85798 13,8962 3,31675 13,2535 3,31675 11.9512V6.59049Z \" / \ u003e \ u003cpath d = \ "M1.87209 0,400291C0.843612 0,400291 0 1,1159 0 1,98861C0 2,87869 0,822846 3,57676 1,87209 3,57676C2.90056 3,57676 3,7234 2,87869 3,7234 1,98861C3.7234 1,1159 2,90056 # 0,40029B 1.87209 11159 2,90056 # 0,40029B 1.87209" "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml: "Contribuições do usuário licenciadas sob \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (política de conteúdo) \ u003c / a \ u003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
, imediatamenteShowMarkdownHelp: true, enableTables: true, enableSnippets: true
});
}
});
Obrigado por contribuir com uma resposta para Stack Overflow!
Certifique-se de responder à pergunta. Forneça detalhes e compartilhe sua pesquisa!
Mas evite ...
Pedir ajuda, esclarecimento ou responder a outras respostas.
Fazer declarações com base em opinião; apoie-os com referências ou experiência pessoal.
Para saber mais, veja nossas dicas sobre como escrever boas respostas.
Rascunho salvo
Rascunho descartado
Cadastre-se ou faça o login
StackExchange.ready (function () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Inscreva-se usando o Google
Cadastre-se usando o Facebook
Inscreva-se usando e-mail e senha
Enviar
Postar como convidado
Nome
O email
Obrigatório, mas nunca mostrado
StackExchange.ready (
function () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f25114521% 2fis-it-possible-suspend-já-mostrado-e-novas-notificações- para-uma-quantidade-de% 23nova-resposta ',' question_page ');
}
);
Postar como convidado
Nome
O email
Obrigatório, mas nunca mostrado
Publique a sua resposta
Descartar
Ao clicar em “Publique sua resposta”, você concorda com nossos termos de serviço, política de privacidade e política de cookies
Não é a resposta que você está procurando? Navegue por outras questões marcadas como notificações por push ou faça sua própria pergunta.